package main

import (
	"encoding/gob"
	"fmt"
	"io"
	"net"
	"os"
	"path/filepath"

	"gitee.com/sjy/selfSendfile/common"
	"github.com/astaxie/beego/logs"
)

func HandleTcpConn(conn net.Conn) {
	defer conn.Close()

	// 接收文件信息
	file := receive_fileinfo(conn)

	// 接收文件
	saveFile(conn, file)

	// 回复接收成功
	confirmation := "receive file: " + file.GetFileUrl()
	logs.Info(confirmation)

	// 创建确认信息
	encoder := gob.NewEncoder(conn)
	err := encoder.Encode(&confirmation)
	if err != nil {
		logs.Error("send confirmation error: %v", err)
	}
}

func receive_fileinfo(conn net.Conn) common.FileInfo {
	// 接收文件信息
	decoder := gob.NewDecoder(conn)
	var file common.FileInfo
	err := decoder.Decode(&file)
	if err != nil {
		panic(fmt.Errorf("decode fileinfo error: %v", err))
	}

	if file.IsEmpty() {
		panic("bad connection!")
	}

	// 发送确认收到
	confirmation := "ok"
	encoder := gob.NewEncoder(conn)
	err = encoder.Encode(&confirmation)
	if err != nil {
		panic(fmt.Errorf("send confirmation error: %v", err))
	}

	return file
}

func saveFile(conn net.Conn, file common.FileInfo) {
	path := file.GetFileUrl()

	// 检查文件是否存在
	if _, err := os.Stat(path); err == nil {
		// 文件存在，删除文件
		if err := os.Remove(path); err != nil {
			panic(fmt.Errorf("failed to remove existing file: %v", err))
		}
	}

	// 获取文件所在的目录
	dir := filepath.Dir(path)

	// 创建目录（如果目录不存在）
	err := os.MkdirAll(dir, os.ModePerm)
	if err != nil {
		panic(fmt.Errorf("create dir error: %v; \n %v", dir, err))
	}

	// 创建文件
	container, err := os.Create(path)
	if err != nil {
		panic(fmt.Errorf("create file error: %v; \n %v", path, err))
	}
	defer container.Close()

	// 接收文件数据
	_, err = io.Copy(container, conn)

	if err != nil {
		panic(fmt.Errorf("write file data error: %v", err))
	}
}
